import pymysql


class JDBC:
    # 创建类属性：数据库连接、游标
    __conn = None
    __curs = None

    # 工具一 创建数据库连接
    @classmethod
    def __get_conn(cls):
        ip = "211.103.136.244"  # 服务器的ip
        port = 7061  # 端口
        user = "student"  # 用户名
        password = "iHRM_student_2021"  # 密码
        # db = "test_db"  # 数据库名
        database = "ihrm"  # 数据库名
        charset = "utf8"  # 字符集

        # 创建连接，往类属性__conn里存放
        cls.__conn = pymysql.connect(host=ip, port=port, user=user, password=password, database=database, charset=charset)
        print("创建连接")
        return cls.__conn.Error

    # 工具二 创建游标
    @classmethod
    def __get_cursor(cls):
        # 调用工具一，创建连接
        cls.__get_conn()
        # 创建好连接以后，就可以创建游标，往类属性__curs里存放
        cls.__curs = cls.__conn.cursor()
        print("创建游标")
        return cls.__curs

    # 工具三 关闭游标
    @classmethod
    def __close_cursor(cls):
        # 直接通过类属性__curs 关闭游标
        cls.__curs.close()
        print("关闭游标")

    # 工具四 关闭连接
    @classmethod
    def __close_conn(cls):
        # 直接通过类属性__conn 关闭游标
        cls.__conn.close()
        print("关闭连接")

    # 工具五 执行sql语句
    @classmethod
    def sql_perform(cls, sql):
        # 调用工具二 建立连接，并获取游标，此时类属性__curs才会有值
        cls.__get_cursor()
        try:
            # 执行sql语句
            cls.__curs.execute(sql)
            # 判断当前语句是select或者非select语句
            # # 当它是select语句时
            if sql.split()[0].lower() == "select":
                # 再返回结果集
                res = cls.__curs.fetchall()
                print("查询结果集===", res)
                print("结果集的行数===", cls.__conn.affected_rows())
                return res

            # # 否则，当它是非select语句时
            else:
                # 当整个事务没有异常发生的时候，进行提交事务
                cls.__conn.commit()
                affected_rows = cls.__conn.affected_rows()
                print("生效的行数===", affected_rows)

                return affected_rows

        # 当整个事务有异常发生的时候
        except Exception as e:
            print("Error===", e)
            # 如果执行的sql语句不是查询语句，而是增删改语句，才需要做回滚操作
            if sql.split()[0].lower() != "select":
                print("进行回滚操作")
                cls.__conn.rollback()

        finally:
            # 关闭游标对象，直接调用做好的小工具
            cls.__close_cursor()
            # 关闭数据库连接，直接调用做好的小工具
            cls.__close_conn()
